package com.wyl.spelAndAop.helloworld;

import org.springframework.expression.EvaluationContext;
import org.springframework.expression.Expression;
import org.springframework.expression.ParserContext;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;

/**
 * @author 吴宇亮 on 2023/4/11 10:20
 */
public class Spel01 {

    public static void main(String[] args) {
        test01();
        test02();
        test03();
    }

    public static void test01() {
        //SpelExpressionParser入门
        // 在Spel表达式中如果想表示一个字符串需要使用''将字符串引起了，否在就会当做成是一个变量
        String str01 = "'hello'";//字符串
        String str02 = "1 + 1";//可以进行运算
        String str03 = "'hello'.toUpperCase()";//可以表达式方法调用
        String str04 = "T(java.com.wyl.util.UUID).randomUUID().toString().replace('-' , '')";//可以调用静态方法
        SpelExpressionParser spelExpressionParser = new SpelExpressionParser();
        Expression expression = spelExpressionParser.parseExpression(str04);
        String value = expression.getValue(String.class);
        System.out.println(value);
    }

    public static void test02() {
        // ParserContext指定解析边界
        // 作为一个表达式而言，有时可能只需要将其一部分通过解析器进行解析。那么此时就需要使用ParserContext定义解析器要解析的边界。
        String str = "skuInfo:#{1 + 1}:#{'hello'.toUpperCase()}:#{T(java.com.wyl.util.UUID).randomUUID().toString().replace('-' , '')}";
        SpelExpressionParser spelExpressionParser = new SpelExpressionParser();
        Expression expression = spelExpressionParser.parseExpression(str, ParserContext.TEMPLATE_EXPRESSION);//ParserContext.TEMPLATE_EXPRESSION解析格式前缀#{后缀}
        String value = expression.getValue(String.class);
        System.out.println(value);
    }

    public static void test03() {
        String str = "skuInfo:#{#params.toUpperCase()}";
        SpelExpressionParser spelExpressionParser = new SpelExpressionParser();
        Expression expression = spelExpressionParser.parseExpression(str, ParserContext.TEMPLATE_EXPRESSION);
        EvaluationContext evaluationContext = new StandardEvaluationContext();   // SPEL表达式上下文对象
        evaluationContext.setVariable("params", "hello");
        String value = expression.getValue(evaluationContext, String.class);     // 获取值的时候将上下文对象作为方法参数传递过去
        System.out.println(value);
    }
}
